package com.justrun.exception;

import com.justrun.response.ResultCodeEnum;
import com.justrun.response.ResultEntity;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.AuthorizationException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 异常处理类
 * @author Chandler
 *
 * SpringBoot中有一个ControllerAdvice的注解，使用该注解表示开启了全局异常的捕获，
 * 我们只需在自定义一个方法使用ExceptionHandler注解然后定义捕获异常的类型即可对这些捕获的异常进行统一的处理。
 */
@RestControllerAdvice //拦截异常并统一处理，相当于@ResponseBody+@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 全局异常处理，部分类型
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class)
    public ResultEntity globalError(Exception e){
        log.error("异常{}",e.getCause().getMessage());
        return ResultEntity.fail().code(ResultCodeEnum.UNKOWN_ERROR.getCode())
                .message(ResultCodeEnum.UNKOWN_ERROR.getMesssage());
    }

    /**
     * 捕获自定义异常
     * @param e
     * @return
     */
    @ExceptionHandler(CustomException.class)
    public ResultEntity customError(CustomException e){
        log.error("捕获到自定义异常：{}",e.getMyErrorMessage());
        return ResultEntity.fail().code(e.getMyErrorCode())
                .message(e.getMyErrorMessage());
    }

    /**
     * shiro权限异常拦截
     * @return
     */
    @ExceptionHandler(AuthorizationException.class)
    public ResultEntity authorizationError(){
        return ResultEntity.fail().code(ResultCodeEnum.AUTHORITY_ERROR.getCode())
                .message(ResultCodeEnum.AUTHORITY_ERROR.getMesssage());
    }
}
